home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
HARDWARE
/
IICALARM
/
!iicAlarm
/
AlarmSet
(
.txt
)
< prev
next >
Wrap
RISC OS BBC BASIC V Source
|
1994-05-04
|
11KB
|
373 lines
>AlarmDk030
AlarmSet 0.30
Dekodiere !Alarm-File von RISC OS 3.11
Version 0.30
Lade Alarmfile, teste Header
Suche naechsten Task-Alarm
Stelle Zeit fest
umrechnen der Zeit nach Territory, PRM3 3-785ff
kodiere Zeit fuer IIC-Uhr und setzte Zeit.
Setze Alarm-Modus in der Uhr und schalte Alarm-Leitung aus.
+8192
globale Variablen
>clkadr% = %10100000 :
IIC-Adresse der Archimedes-Uhr
=file$ = "<Alarmfile>" :
Name und Pfad der Alarm-Datei
buf% 32
"Error in ";
"*CLOSE":
8debug% =
:
Informationstexte anzeigen ?
"XOS_ReadVarVal", "AlarmExt$Debug", buf%, -1, 0, 0
,,d%
d%<>0
debug% =
"XWimp_ReadSysInfo", 3
d%=0
debug% =
debug%
"AlarmSet version 0.30, ABt. "
This is to help the shutdown-routine.
We need to know the status of the computer because we have to decide
between desktop-shutdown and non-desktop...
If we are in command-mode/non-desktop. We can simply call the
switch-off function.
We check it by the number of existing applications.
0 = No Desktop at all. 1 = only we are running. >1 = more apps exist.
"Wimp_ReadSysInfo", 0
tasknum%
tasknum%<2
*Set Alarm$Desktop NO
*Set Alarm$Desktop YES
-#a% =
setzeTaskalarmzeit(file$)
/*
1 :
"Error: Missing Alarmfile."
0=
2 :
"Error in Alarmfile: wrong file/format or so."
5O---------------------------------------------------------------------------
_setze_Task-Alarm-Zeit
7I; die Routine liest die Alarm-Datei und sucht den naechste Task-Alarm
8C; heraus. Die Zeit wird gelesen und in die IIC-Uhr geschrieben.
9>; Es werden eigene fehlerstabile Dateilesebefehle benutzt.
:A; Am Ende gibt die Routine zentral eine Fehlermeldung heraus.
;G; Es wird auch nicht die ganze Datei gelesen, sondern lediglich die
<D; interessanten Stellen angefahren und jeweils ein Byte gelesen.
; moegliche Fehlercodes...
; 1 - Alarmdatei fehlt.
??; 2 - falsche Alarmdatei, zu kurz, falscher Header oder so.
A-; Ein: String mit Pfad und Name der Datei
B%; Aus: Fehlercode ( = 0 wenn ok.)
setzeTaskalarmzeit(name$)
err%, err$, hdl%, rec%, flag%, buf%, str%, ord%
l%, n%, n$
buf% 16, str% 64, ord% 40
IF
Wir haben ein lokales Error-System um Dateifehler abzufangen.
JK
Dies wird nur noch benoetigt, um ungewoehnliche Fehler abzufangen.
L=
"FNsetzeTaskalarmzeit: Error in ";
err% = 0
err$ = ""
P;
Oeffne Datei und teste damit ob sie vorhanden ist.
Q6
Der Handle ist 0, wenn Datei nicht vorhanden.
R&
debug%
"File:";name$;" ";
hdl% =
openin(name$)
T(
debug%
" Filehandle: ";hdl%
U=
hdl% = 0
err% = 1: err$ = "Alarmdatei nicht da !!"
Lade Header
err% = 0
n$ = ""
l%=1
n% =
bget(hdl%)
n%<0
err% = 2
^/ err$ = "Alarmheader zu kurz !!"
l% = 99
n$ = n$ +
Teste Header
err% = 0
n$ <> "ALRM"
err% = 2
j/ err$ = "Alarmfileformat falsch !!"
n$
Schleife durch alle Rekords
rec% = -1: flag% =
err% = 0
rec% += 1
Lese Task-Flag
t8 err% =
ptr(hdl%, &0E + &94 + (&97 * rec%))
err% <> 0
v5
Fileende erreicht, normales Ende !!
err% = -1
x0 err$ = "Rekord-Ende erreicht !!"
flag% =
{ n% =
bget(hdl%)
n% < 0
err% = -n%
~3 err$ = "Lesefehler im Rekord !!"
)
Teste auf Task-Alarm
+
(n%
4) = 4
flag%=
flag%
Wenn ein Taskalarm gefunden wurde koennen wir weitermachen.
Wir holen dann die "lokale" Zeit aus dem Rekord.
err% = 0
+
#hdl% = &0E + &0F + (&97 * rec%)
! ord%!24 = 256 *
#hdl%
ord%!24 +=
#hdl%
ord%!20 =
#hdl%
ord%!16 =
#hdl%
ord%!12 =
#hdl%
ord%!8 =
#hdl%
ord%!4 =
#hdl%
ord%!0 = 0
*
Nach Territory modifizieren...
=
"Territory_ConvertOrdinalsToTime", -1, buf%, ord%
1
buf% enthaelt nun die 5Byte UTC-Zeit.
=
"Territory_ConvertTimeToUTCOrdinals", ,buf%, ord%
3
ord% enthaelt nun die UTC in Ordinalen.
0
debug%
" Set to taskalarm ";
Wenn kein Taskalarm gefunden wurde, setzen wir die aktuelle Zeit !!
err% = -1
6
Hole UTC-Zeit als 5 Byte Block, PRM3 1-421
?buf% = 3
"OS_Word", 14, buf%
1
buf% enthaelt nun die 5Byte UTC-Zeit.
=
"Territory_ConvertTimeToUTCOrdinals", ,buf%, ord%
3
ord% enthaelt nun die UTC in Ordinalen.
, ord%!0 = 0: ord%!4 = 0: ord%!8 = 0
0
debug%
" Set to current ";
err% = 0
Jetzt wird die Zeit eingesetzt in die Uhrenregister.
err% = 0
debug%
@
5Byte UTC-Zeit in buf% in Zeitstring konvertieren
Z
"OS_ConvertDateAndTime", buf%, str%, 40, "%DY %MN %CE%YR.%24:%MI:%SE"
?l% = 13
!
"time : ";$str%"."
'
Alarmbuffer zusammenstellen
+
Zieladresse im Buffer eintragen
buf%?0 = 9
*
Hundertstel Sekunden eintragen
8 buf%?1 = (ord%!0
10) + ((ord%!0
10)<< 4)
!
Sekunden (bei +17/18)
8 buf%?2 = (ord%!4
10) + ((ord%!4
10)<< 4)
Minuten (bei +14/15)
8 buf%?3 = (ord%!8
10) + ((ord%!8
10)<< 4)
Stunden (bei +11/12)
8 buf%?4 = (ord%!12
10) + ((ord%!12
10)<< 4)
Tag (bei +0/1)
8 buf%?5 = (ord%!16
10) + ((ord%!16
10)<< 4)
Monat (bei +3/4)
8 buf%?6 = (ord%!20
10) + ((ord%!20
10)<< 4)
Alarm Timer
buf%?7 = 0
8
Zeit in Alarm-Register der IIC-Uhr schreiben
putAlarm(buf%)
SwitchToAlarm
AlarmActivate
Jetzt behandeln wir aufgetretene Fehler und zeigen sie an.
err%<>0
debug%
;
"Error in FNsetzeTaskalarmzeit: Zeile ";
-
"erkannte Ursache: ";err%;":"err$
#hdl%
= err%
N;-------------------------------------------------------------------------
$; Filehandling mit Errorabfragen
E; wir koenen nur durch lokale Error-Handler erreichen, den Status
'; einer IO-Operation festzustellen.
H; Dies ist insofern doesig, da wir alle IO-Operationen neu schreiben
; muessen.
9; Die Funktionen geben den Errorcode zurueck. 0 = ok.
N;-------------------------------------------------------------------------
openin(file$)
#h%: =0:
"FNopen: File nicht da !": =0
h% =
(file$)
#h% = 0
ptr(hdl%, off%)
"FNptr: Fileende erreicht !!": =
#hdl% = off%
bget(hdl%)
"FNbget: Fileende erreicht !": = -
d% =
#hdl%
N;-------------------------------------------------------------------------
B; IIC-Routinen - abgestimmt auf den Uhrenbaustein.
N;-------------------------------------------------------------------------
8; Speichern eines Bytes an einer beliebigen Adresse.
N;-------------------------------------------------------------------------
poke(address%, value%)
blk%
blk% 2
clkadr% = 0
clkadr% = %10100000 :
Default is normal clock.
?blk% = address%
?(blk%+1) = value%
"IIC_Control", clkadr%, blk%, 2
N;-------------------------------------------------------------------------
G; Lesen eines Bytes von einer beliebigen Adresse. Kann auch benutzt
'; werden, um die Adresse zu setzen.
N;-------------------------------------------------------------------------
peek(address%)
blk%
blk% 2
clkadr% = 0
clkadr% = %10100000 :
Default is normal clock.
?blk% = address%
"IIC_Control", clkadr% , blk%, 1 :
write address
"IIC_Control", clkadr%+1, blk%, 1 :
read value
= ?blk%
N;-------------------------------------------------------------------------
?; Schreiben der aktuellen Alarmzeit aus einem 8-Byte-Buffer
N; ACHTUNG: Das 1. Byte ist das Statusbyte und wird nicht mitgeschrieben !!
; pointer_char[8] buffer%
N;-------------------------------------------------------------------------
putAlarm(buffer%)
old%
buffer% <> 0
clkadr% = 0
clkadr% = %10100000 :
Default is normal clock.
D old% = ?buffer% :
store old status
D ?buffer% = 9 :
set startaddress
"IIC_Control", clkadr%, buffer%, 8 :
write address and data
D ?buffer% = old% :
restore old status
!N;-------------------------------------------------------------------------
"<; (1) Wir schalten die Uhr auf Alarm-Modus und damit den
#G; default- (reset-) maessigen Sekundentakt am Alarmausgang aus.
$N;-------------------------------------------------------------------------
SwitchToAlarm
' a% =
peek(0)
(255-1-2-4)
a% += 4
poke(8,0) :
Alarm-Register : alles "aus"
poke(0,a%) :
Status-Register: Alarm-System "an"
Alarm nun aktiv, Bit 0 = 0 --> Alarm = 0
.N;-------------------------------------------------------------------------
/"; Aktivieren des Alarm-Systems
03; Vorher muss
SwitchToAlarm aufgerufen werden.
; Entry -
; Exit -
3N;-------------------------------------------------------------------------
AlarmActivate
5Z
poke(8,48+128) :
Alarm-Register: NO timer, dated alarm, alarm flag & interrupt
8N;-------------------------------------------------------------------------
9$; Deaktivieren des Alarm-Systems
:0; dies ist also nicht dasselbe wie ...init !
; Entry -
; Exit -
=N;-------------------------------------------------------------------------
AlarmDeactivate
?6
poke(8,0) :
Alarm-Register: alles aus